import { IQueue, IQueueIterator } from "./types";
import DoubleCycleLinkedList from '@/sources/LinkedList/doubleCycleLinkedList'

// 双端队列
export default class Queue<T = number> implements IQueue<T> {
    private dcl: DoubleCycleLinkedList<T>
    constructor() {
        // 初始化arrayList
        this.dcl = new DoubleCycleLinkedList<T>()
    }

    /**
     * 获取队列的长度
     */
    size() {
        return this.dcl.size()
    }

    /**
     * 判断队列是否为空
     */
    isEmpty() {
        return this.dcl.isEmpty();
    }

    /**
     * 清空队列元素
     */
    clear() {
        this.dcl.clear()
    }

    /**
     * 入队, 默认从尾部
     * @param element 
     */
    enQueue(element: T) {
        this.dcl.add(element)
    }

    /**
     * 从头部入队
     * @param element 
     */
    enFirstQueue(element: T) {
        this.dcl.unshift(element)
    }

    /**
     * 出队, 默认从头
     */
    deQueue() {
        return this.dcl.shift()!;
    }

    /**
     * 获取最后一个元素
     */
    getLastEle() {
        return this.dcl.getLastEle()
    }

    /**
     * 从尾部出队
     */
    deTailQueue() {
        if (this.isEmpty()) return undefined
        return this.dcl.pop()!
    }

    /**
     * 获取队头元素
     */
    front() {
        return this.dcl.get(0)?.value!
    }

    /**
     * 遍历队列
     */
    forEach(cb: IQueueIterator<T>) {
        this.dcl.forEach((node, i) => {
            cb(node.value!, i)
        })
    }
} 